#include <iostream>
#include <cmath>

using namespace std;

// class Symm {
// public:
//     Symm(int n) : digits(n) {}

//     bool isPrime(int number) {
//         if (number <= 1) return false;
//         for (int i = 2; i <= sqrt(number); ++i) {
//             if (number % i == 0) return false;
//         }
//         return true;
//     }

//     bool isPalindrome(int number) {
//         int reversed = 0, original = number;
//         while (number > 0) {
//             reversed = reversed * 10 + number % 10;
//             number /= 10;
//         }
//         return original == reversed;
//     }

//     void print() {
//         for (int i = pow(10, digits - 1); i < pow(10, digits); ++i) {
//             if (isPalindrome(i) && isPrime(i)) {
//                 cout << i;
//                 if (i < pow(10, digits) - 1) cout << " ";
//             }
//         }
//         cout << endl;
//     }

// private:
//     int digits;
// };
// class Symm
// {
// private:
//     int digit;
// public:
//     Symm(int n):digit(n){}
//     bool isPrime(int number)
//     {
//         if(number<=1)return false;
//         for(int i=2;i<=sqrt(number);i++)
//         {
//             if(number%i==0)
//                 return false;
//         }
//         return true;
//     }
//     bool Coilnumber(int number)
//     {
//         int a=0;
//         int b=number;
//         while(number>0)
//         {
//             a=a*10+number%10;
//             number/=10;
//         }
//         return b==a;
//     }
//     void print()
//     {
//         for(int i=pow(10,digit-1);i<pow(10,digit);i++)
//         {
//             if(isPrime(i)&&Coilnumber(i))
//             {
//                 cout<<i;
//                 if(i<pow(10,digit)-1)cout<<" ";
//             }
//         }
//         cout<<endl;
//     }
// };
// int main() {
//     int m;
//     cin >> m;
//     Symm symm(m);
//     symm.print();
//     return 0;
// }
class Matrix
{
private:
    int c, d;
    int a[100][100];
public:
    Matrix() :c(0), d(0) {}
    friend istream& operator>>(istream& is, Matrix& m)
    {
        cin >> m.c >> m.d;
        for (int i = 0; i < m.c; i++)
        {
            for (int j = 0; j < m.d; j++)
            {
                is >> m.a[i][j];
            }
        }
        return is;
    }
    friend ostream& operator<<(ostream& os, Matrix& m)
    {
        if (m.c == 0)
        {
            os << "Error" << endl;
            return os;
        }
        for (int i = 0; i < m.c; i++)
        {
            for (int j = 0; j < m.d; j++)
            {
                if (!j)
                    os << m.a[i][j];
                else
                    os << " " << m.a[i][j];
            }
            os << endl;
        }
        return os;
    }
    friend Matrix operator+(Matrix& m, Matrix& n)
    {
        Matrix t;
        if (m.c != n.c || n.d != m.d)
            return t;
        t.c = m.c;
        t.d = m.d;
        for (int i = 0; i < m.c; i++)
        {
            for (int j = 0; j < m.d; j++)
            {
                t.a[i][j] = m.a[i][j] + n.a[i][j];
            }
        }
        return t;
    }
    friend Matrix operator*(Matrix& m, Matrix& n)
    {
        Matrix t;
        if (m.d != n.c)
            return t;
        t.c = m.c;
        t.d = n.d;

        for (int i = 0; i < t.c; i++)
        {
            for (int j = 0; j < t.d; j++)
            {
                int s = 0;
                for (int k = 0; k < m.d; k++)
                {
                    s += m.a[i][k] * n.a[k][j];
                }
                t.a[i][j] = s;
            }
        }
        return t;
    }
};
int main()
{
    int cases, i;
    cin >> cases;
    for (i = 0; i < cases; i++)
    {
        Matrix A, B, C, D;
        cin >> A >> B;
        C = A + B;
        D = A * B;
        cout << "Case " << i + 1 << ":" << endl;
        cout << C << endl;
        cout << D;
    }
    return 0;
}